import time
from  threading import Thread,Lock
import requests   #requests是通过url获取网络资源
from bs4 import BeautifulSoup   #再通过BeautifulSoup过滤，解析出想要的内容
from datetime import datetime

#爬取豆瓣音乐TOP250数据
#原理：四个线程去urls里面过去网页地址，拿到网页地址之后，去爬取网页数据

#创建锁
lock = Lock()

def get_url():  #为了能使get_url获取到urls，用“global”去全局捕获
    global urls
    lock.acquire()
    if len(urls)==0:#如果列表里面没有数据了,释放锁，返回一个空，当返回为空的时候，循环结束
        lock.release()
        return ""
    else:
        url = urls[0]   #有数据就获取到的url是urls的第一项  获取之后删除  循环下一项  这样下次去拿数据的时候永远是第一个 删除完之后 释放锁返回url
        del urls[0]
    lock.release()
    return url

#通过拿到的url，爬取网页的数据
def down_data(url):
    header={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
    }
    #通过requests获取的服务端的数据
    res_data = requests.get(url,headers=header)
    #创建一个BeautifulSoup对象,对数据进行解析
    soup = BeautifulSoup(res_data.text,"lxml")
    #找到所有的class=pl2 的div
    items = soup.select(".pl2")
    for item in items:  #item是每一个pl2  items是所有的pl2
        title = item.a.text.strip().replace("\n","") #每一个pl2的超链接里面的文本内容   .strip()去掉空格    .replace("\n","")去掉换行  \n换行替换成一个空字符串
        arr = item.find(attrs={"class":"pl"}).get_text().strip().split("/")# item中去找class=pl的div标签下的所有文本内容  .split("/")表示获取到每一个内容
        info = {
            "歌曲名称":title,
            "歌手":arr[0],
            "发布时间":arr[1],
            "类型":arr[-1] #-1表示列表最后一项
        }
        print(info)



class Spider(Thread):
    def __init__(self,name):
        Thread.__init__(self)
        self.name = name

    def run(self) :
        while True:
            url = get_url()
            if url=="":#如果url数据拿完了，则循环结束
                break
            else:       #如果拿到了url
                down_data(url)

if __name__ == "__main__":

    #在程序开始的时候获取他的当前时间
    starttime = datetime.now()
    urls = [f"https://music.douban.com/top250?start={i}"
            for i in range(0,250,25)]#f:把i传到字符串去  25表示步长  从0到250  每次i为25

    #创建线程
    thread1=Spider("t1")
    thread2 = Spider("t2")
    thread3 = Spider("t3")
    thread4 = Spider("t4")

    thread1.start()
    thread2.start()
    thread3.start()
    thread4.start()

    thread1.join()
    thread2.join()
    thread3.join()
    thread4.join()

    #结束时间
    endtime = datetime.now()

    print(f"总共用了{(endtime-starttime).seconds}秒")
